<?php
namespace App\Lib\Consul;

use Swoft\Bean\Annotation\Mapping\Bean;

/**
 * Class ServerConfig
 *
 * @Bean("ServiceConfig")
 *
 * @package App\Rpc\Lib
 */
class ServiceConfig
{

    /**
     * 服务唯一ID
     * @var string
     */
    private $uuid;

    /**
     * 服务名称
     * @var string
     */
    private $name;

    /**
     * 服务端口号
     * @var int
     */
    private $port;

    /**
     * 服务地址
     * @var string
     */
    private $address;

    /**
     * 服务元数据
     * @var array
     */
    private $metas = [];

    /**
     * 服务标签
     * @var array
     */
    private $tags = [];

    /**
     * 限流 消耗秘钥
     * @var int
     */
    private $rate = 1;

    /**
     * 限流 秘钥池容量
     * @var int
     */
    private $max = 100;

    /**
     * 服务名前缀
     * @var string
     */
    private $prefix = '';

    /**
     * 服务命名空间
     * @var string
     */
    private $namespace = 'App.Rpc.Lib';

    /**
     * 初始化一个 ID
     */
    public function init(){
        $this->uuid = uuid();
        $this->address = getLocalIP();
        $this->initMetas();
        $this->initTags();
    }

    /**
     * @return string
     */
    public function getUuid(): string
    {
        return $this->uuid;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->prefix . '_' . $this->name;
    }

    /**
     * @return int
     */
    public function getPort(): int
    {
        return $this->port;
    }

    /**
     * @return mixed
     */
    public function getAddress()
    {
        return $this->address;
    }

    /**
     * @return array
     */
    public function getMetas(): array
    {
        return $this->metas;
    }

    /**
     * @return array
     */
    public function getTags(): array
    {
        return $this->tags;
    }

    /**
     * 初始化服务元数据
     */
    private function initMetas() {

        // 设置服务地址
        $this->metas['SERVICE_ADDRESS'] = $this->address;
        $this->metas['SERVICE_PORT'] = (string)$this->port;

        // 设置限流
        $limiterDefault = false;
        if($limiterDefault = config('service.enable_default_limiter', false) && $limiterDefault == 'Y'){
            // 如果存在 ENV_LIMITER_DEFAULT 配置 并且配置信息是Y 则执行默认配置
            $this->metas['LIMITER_RATE'] = $this->rate;
            $this->metas['LIMITER_MAX'] = $this->max;
        }
        else{
            // 如果配置了一下环境变量则执行配置
            if($rate = config('service.limiter_rate', false)) $this->metas['LIMITER_RATE'] = $rate;
            if($max = config('service.limiter_max', false)) $this->metas['LIMITER_MAX'] = $max;
        }

        // 设置 JWT 鉴权
        if($actions = config('service.validate_actions', false)) {
            // 如果actions == all 则所有路由需要鉴权 多个路由之间需要使用 英文逗号 隔开
            $this->metas['VALIDATE_ACTIONS'] = $actions; // 需要鉴权的action（类方法）
        }

        //加载权限配置@alpha
        $this->metas['ACTION_PERMISSION'] = config('service.permisison', '');

        // 设置 服务命名空间
        $this->metas['SERVICE_NAMESPACE'] =  config('service.service_namespace', $this->namespace); // 命名空间
    }

    /**
     * 初始化服务标签
     */
    private function initTags(){
        $this->tags = explode(',', config('service.service_tags', $this->address));
    }

}
